package controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import exceptions.FechaException;

import Interphase.LiforBasquetTDA;
import model.*;
import viewObjects.*;
import persistence.*;

public class Application implements LiforBasquetTDA{

	private ArrayList<Sede> sedes;
	private ArrayList<Arbitro> arbitros;
	private ArrayList<Torneo> torneos;
	private ArrayList<Equipo> equipos;
	//private Categoria categoriaActual;
	//private Torneo torneoActual;
	private static Application application;
	
	public static Application getInstace(){
		if (application == null)
			application = new Application();		
		
		return application;
	}
	
	
	private Application(){
		this.sedes = new ArrayList<Sede>();
		this.arbitros = new ArrayList<Arbitro>();
		//Levanto todos los torneos de la BD
		this.torneos = TorneoPersistsAdm.getInstance().select();
		this.equipos = new ArrayList<Equipo>();
	}
	
	//Comienzo Codigo
	
	//Metodos de busqueda
	private Torneo buscarTorneo(int id){
		Torneo ret = null;
		
		for (Torneo torneo : this.torneos){
			if (torneo.getId() == id){
				ret = torneo;
			}
		}
		
		return ret;
	}

	//Metodos Intercambio
	@Override
	public ArrayList<TorneoVO> getTorneos(boolean extended){
		ArrayList<TorneoVO> torneos = new ArrayList<TorneoVO>();
		
		for(Torneo torneo : this.torneos){
			if (! extended){
				torneos.add(torneo.getMinimalView());
			}else{
				torneos.add(torneo.getExtendedView());
			}
		}
		
		return torneos;
	}


	@Override
	public TorneoVO crearTorneoPreexistente(int id, Date fechaInicio,
			String nombre, int movimientos) {
		Torneo nuevoTorneo = new Torneo(buscarTorneo(id), nombre, fechaInicio, movimientos);		
		return nuevoTorneo.getExtendedView();
	}
	
	@Override
	public ArrayList<JugadorVO>  generarPartidoEstrellas(int idTorneo, int idCategoria){
		ArrayList<JugadorVO> jugadores = new ArrayList<JugadorVO>();
		
		Categoria categoria = buscarTorneo(idTorneo).getCategoria(idCategoria);
		ArrayList<Jugador> aleros = categoria.getMejoresJugadoresPorPosicion(constants.Posicion.ALERO, 4);
		ArrayList<Jugador> pivotes = categoria.getMejoresJugadoresPorPosicion(constants.Posicion.PIVOT, 4);
		ArrayList<Jugador> bases = categoria.getMejoresJugadoresPorPosicion(constants.Posicion.BASE, 2);
		
		for (Jugador j : aleros){
			jugadores.add(j.getView());
		}
		for (Jugador j : pivotes){
			jugadores.add(j.getView());
		}
		for (Jugador j : bases){
			jugadores.add(j.getView());
		}
		
		return jugadores;
	}
	
	@Override
	public FechaVO generarPlayoff(int idTorneo, int idCategoria, String instancia, Date fechaInicio) throws FechaException{
		Categoria categoria = buscarTorneo(idTorneo).getCategoria(idCategoria);
		return categoria.getFixture().generarPlayoff(instancia, fechaInicio, categoria.getPosiciones(),this.sedes);			
	}
}
